home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 001-100 / 001-025 / 023 / ver30 / sys / sysv / ttyio.c < prev   
C/C++ Source or Header  |  1995-03-17  |  4KB  |  160 lines

  1. /*
  2.  * Name:    MicroEMACS
  3.  *        System V terminal I/O.
  4.  * Version:    0
  5.  * Last edit:    17-Apr-86
  6.  * By:        gonzo!daveb
  7.  *        {sun, amdahl, mtxinu}!rtech!gonzo!daveb
  8.  *
  9.  * The functions in this file
  10.  * negotiate with the operating system for
  11.  * keyboard characters, and write characters to
  12.  * the display in a barely buffered fashion.
  13.  *
  14.  * This version goes along with tty/termcap/tty.c.
  15.  * Terminal size is determined there, rather than here, and
  16.  * this does not open the termcap file
  17.  */
  18. #include    "def.h"
  19.  
  20. #include    <sys/types.h>
  21. #include    <fcntl.h>
  22. #include    <termio.h>
  23.  
  24. #define    NOBUF    512            /* Output buffer size.        */
  25.  
  26. char    obuf[NOBUF];            /* Output buffer.        */
  27. int    nobuf;                /* buffer count            */
  28.  
  29. static struct termio    ot;        /* entry state of the terminal    */
  30. static struct termio    nt;        /* editor's terminal state    */
  31.  
  32. static int ttyactivep = FALSE;        /* terminal in editor mode?    */
  33. static int ttysavedp = FALSE;        /* terminal state saved?    */
  34.  
  35. int    nrow;                /* Terminal size, rows.        */
  36. int    ncol;                /* Terminal size, columns.    */
  37.  
  38. /*
  39.  * This function gets called once, to set up
  40.  * the terminal channel.  This version turns off flow
  41.  * control.  This may be wrong for your system, but no
  42.  * good solution has really been found (daveb).
  43.  */
  44. ttopen()
  45. {
  46.     register char    *cp;
  47.     extern char    *getenv();
  48.  
  49.     if (ttyactivep)
  50.         return;
  51.  
  52.     if( !ttysavedp )
  53.     {
  54.         if (ioctl(0, TCGETA, &ot) < 0)
  55.             abort();
  56.         nt = ot;        /* save entry state        */
  57.         nt.c_cc[VMIN] = 1;    /* one character read is OK    */
  58.         nt.c_cc[VTIME] = 0;    /* Never time out.        */
  59.         nt.c_iflag |= IGNBRK;
  60.         nt.c_iflag &= ~( ICRNL | INLCR | ISTRIP | IXON | IXOFF );
  61.         nt.c_oflag &= ~OPOST;
  62.         nt.c_cflag |= CS8;    /* allow 8th bit on input    */
  63.         nt.c_cflag &= ~PARENB;    /* Don't check parity        */
  64.         nt.c_lflag &= ~( ECHO | ICANON | ISIG );
  65.         ttysavedp = TRUE;
  66.     }
  67.     
  68.     if (ioctl(0, TCSETAF, &nt) < 0)
  69.         abort();
  70.  
  71.     /* This really belongs in tty/termcap... */
  72.  
  73.     if ((cp=getenv("TERMCAP")) == NULL
  74.     || (nrow=getvalue(cp, "li")) <= 0
  75.     || (ncol=getvalue(cp, "co")) <= 0) {
  76.         nrow = 24;
  77.         ncol = 80;
  78.     }
  79.     if (nrow > NROW)            /* Don't crash if the    */
  80.         nrow = NROW;            /* termcap entry is    */
  81.     if (ncol > NCOL)            /* too big.        */
  82.         ncol = NCOL;
  83.  
  84.     ttyactivep = TRUE;
  85. }
  86.  
  87. /*
  88.  * This routine scans a string, which is
  89.  * actually the return value of a getenv call for the TERMCAP
  90.  * variable, looking for numeric parameter "name". Return the value
  91.  * if found. Return -1 if not there. Assume that "name" is 2
  92.  * characters long. This limited use of the TERMCAP lets us find
  93.  * out the size of a window on the X display.
  94.  */
  95. getvalue(cp, name)
  96. register char    *cp;
  97. register char    *name;
  98. {
  99.     for (;;) {
  100.         while (*cp!=0 && *cp!=':')
  101.             ++cp;
  102.         if (*cp++ == 0)            /* Not found.        */
  103.             return (-1);
  104.         if (cp[0]==name[0] && cp[1]==name[1] && cp[2]=='#')
  105.             return (atoi(cp+3));    /* Stops on ":".    */
  106.     }
  107. }
  108.  
  109. /*
  110.  * This function gets called just
  111.  * before we go back home to the shell. Put all of
  112.  * the terminal parameters back.
  113.  */
  114. ttclose()
  115. {
  116.     if(!ttysavedp || !ttyactivep)
  117.         return;
  118.     ttflush();
  119.     if (ioctl(0, TCSETAF, &ot) < 0)
  120.         abort();
  121.     ttyactivep = FALSE;
  122. }
  123.  
  124. /*
  125.  * Write character to the display.
  126.  * Characters are buffered up, to make things
  127.  * a little bit more efficient.
  128.  */
  129. ttputc(c)
  130. {
  131.     if (nobuf >= NOBUF)
  132.         ttflush();
  133.     obuf[nobuf++] = c;
  134. }
  135.  
  136. /*
  137.  * Flush output.
  138.  */
  139. ttflush()
  140. {
  141.     if (nobuf != 0) {
  142.         write(1, obuf, nobuf);
  143.         nobuf = 0;
  144.     }
  145. }
  146.  
  147. /*
  148.  * Read character from terminal.
  149.  * All 8 bits are returned, so that you can use
  150.  * a multi-national terminal.
  151.  */
  152. ttgetc()
  153. {
  154.     char    buf[1];
  155.  
  156.     while (read(0, &buf[0], 1) != 1)
  157.         ;
  158.     return (buf[0] & 0xFF);
  159. }
  160.